#include <sem_utils.h>
#include <unistd.h>
#include <sys/shm.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

#define BLOCKER_KEY 0xb10ce3

char* vet = 0;

FILE* output = stderr;

void printVet(char * v){

	int i = 0;

	fprintf(output,"[");
	for(i = 0; i < 100; i++){
		fprintf(output, "%c ", v[i]);
	}
	fprintf(output,"]");
}

void reader(int n){

	fprintf(output, "Reader %d tentando inicar leitura.\n", n);
	if(read_begin(BLOCKER_KEY) == -1){
		fprintf(output, "Erro ao iniciar leitura %d\n", n);
		return;
	}
	fprintf(output, "Reader %d vai fazer a leitura.\n", n);

//	printVet(vet);

	sleep(1);

	if(read_end(BLOCKER_KEY) == -1){
		fprintf(output, "Erro ao terminar leitura %d\n", n);
		return;
	}

	fprintf(output, "Reader %d terminou leitura.\n", n);
}

void writer(int n){

	fprintf(output, "Writer %d tentando inicar escrita.\n", n);
	if(write_begin(BLOCKER_KEY) == -1){
		fprintf(output, "Erro ao iniciar escrita %d\n, %s",n, strerror(errno));
		return;
	}
	fprintf(output, "Writer %d vai fazer a escrita.\n", n);


//	sleep(1);
//	int i;
//
//	if(n % 2){
//		for(i == 0; i < 100; i++){
//			vet[i] = '#';
//		}
//	}
//	else{
//		for(i == 0; i < 100; i++){
//			vet[i] = 0x40 + i%23;
//		}
//	}

	if(write_end(BLOCKER_KEY) == -1){
		fprintf(output, "Erro ao terminar escrita %d - %s\n", n, strerror(errno));
		return;
	}
	fprintf(output, "Writer %d terminou escrita.\n", n);
}

int main(){

	//Inicializo o vetor
	int vetHandler = shmget(0x7E7A, sizeof(vet), IPC_CREAT | 0666);

	vet = (char*) shmat(vetHandler, 0, 0);

	int i = 0;

	for(i = 0; i < 100; i++){
		vet[i] = 0x40 + i%23;
	}

	int rn = 0;

	for(i = 0; i < 3; i++){
		rn = fork();

		if(rn == 0){
			break;
		}
	}

	if(rn == 0){
		//Sou o filho
		while(1) reader(i);
		return 0;
	}

	if(fork() == 0){
		while(1) writer(0);
		return 0;
	}

	if(fork() == 0){
		while(1) writer(1);
		return 0;
	}

	return 0;
}

